package com.utils.conmponentbase.tools;

import android.content.Context;
import android.graphics.Color;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;

import com.luck.picture.lib.PictureSelectionModel;
import com.luck.picture.lib.PictureSelector;
import com.luck.picture.lib.config.PictureConfig;
import com.luck.picture.lib.config.PictureMimeType;
import com.luck.picture.lib.entity.LocalMedia;
import com.luck.picture.lib.style.PictureParameterStyle;
import com.luck.picture.lib.tools.PictureFileUtils;
import com.utils.conmponentbase.R;
import com.utils.conmponentbase.app.BaseApplication;

import java.util.ArrayList;
import java.util.List;

/**
 * MvvmDemo com.utils.conmponentbase.tools
 * 2020-01-03 16:33
 * 选择图片工具类 https://github.com/LuckSiege/PictureSelector
 */
public class PictureSelectorConfig {
    private static volatile PictureSelectorConfig selectorConfig;
    // 相册主题
    private PictureParameterStyle mPictureParameterStyle = new PictureParameterStyle();
    private PictureSelector mPictureSelector;
    private PictureSelectionModel mSelectionModel;

    private int max = 1;
    private boolean isCircle;
    private List<LocalMedia> list;

    private PictureSelectorConfig() {
        list = new ArrayList<>();
        themeConfig(BaseApplication.getInstant().getApplicationContext());
    }

    public static PictureSelectorConfig getInstance() {
        if (selectorConfig == null) {
            synchronized (PictureSelectorConfig.class) {
                if (selectorConfig == null) {
                    selectorConfig = new PictureSelectorConfig();
                }
            }
        }
        return selectorConfig;
    }

    public PictureSelectorConfig create(AppCompatActivity activity, List<LocalMedia> list) {
        mPictureSelector = PictureSelector.create(activity);
        config();
        return selectorConfig;
    }

    public PictureSelectorConfig createVideo(AppCompatActivity activity, List<LocalMedia> list) {
        mPictureSelector = PictureSelector.create(activity);
        configVideo();
        return selectorConfig;
    }

    public PictureSelectorConfig create(Fragment fragment, List<LocalMedia> list) {
        mPictureSelector = PictureSelector.create(fragment);
        config();
        return selectorConfig;
    }

    /**
     * 打开相机
     */
    public void openCamera(AppCompatActivity activity) {
        mSelectionModel = PictureSelector.create(activity)
                .openCamera(PictureMimeType.ofImage());
        cameraConfig();
    }

    /**
     * 打开相机
     */
    public void openCamera(Fragment fragment) {
        mSelectionModel = PictureSelector.create(fragment)
                .openCamera(PictureMimeType.ofImage());
        cameraConfig();
    }

    /**
     * 设置 传入已选图片/视频数据
     */
    public PictureSelectorConfig setList(List<LocalMedia> pList) {
        list = pList;
        return selectorConfig;
    }

    /**
     * 设置最大选择数
     */
    public PictureSelectorConfig setMax(int pMax) {
        max = pMax;
        return selectorConfig;
    }

    /**
     * 是否是圆形剪裁
     */
    public PictureSelectorConfig setCircle(boolean pCircle) {
        isCircle = pCircle;
        return selectorConfig;
    }

    /**
     * PictureSelector 配置
     */
    private void config() {
        // 进入相册 以下是例子：用不到的api可以不写
        mPictureSelector.openGallery(PictureMimeType.ofImage())//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
                .setPictureStyle(mPictureParameterStyle)//主题样式(不设置为默认样式) 也可参考demo values/styles下 例如：R.style.picture.white.style
                .loadImageEngine(GlideEngine.createGlideEngine())//外部传入图片加载引擎
                .maxSelectNum(max)// 最大图片选择数量 int
                .minSelectNum(1)// 最小选择数量 int
                .imageSpanCount(4)// 每行显示个数 int
                .selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE
                .previewImage(true)// 是否可预览图片 true or false
                .previewVideo(false)// 是否可预览视频 true or false
                .enablePreviewAudio(false) // 是否可播放音频 true or false
                .isCamera(true)// 是否显示拍照按钮 true or false
                .imageFormat(PictureMimeType.PNG)// 拍照保存图片格式后缀,默认jpeg
                .isZoomAnim(true)// 图片列表点击 缩放效果 默认true
                //.setOutputCameraPath("/SJYPath")// 自定义拍照保存路径,可不填
                .enableCrop(false)// 是否裁剪 true or false
                .compress(true)// 是否压缩 true or false
                .withAspectRatio(4, 3)// int 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
                .isGif(false)// 是否显示gif图片 true or false
                .freeStyleCropEnabled(false)// 裁剪框是否可拖拽 true or false
                .circleDimmedLayer(isCircle)// 是否圆形裁剪 true or false
                .openClickSound(false)// 是否开启点击声音 true or false
                .selectionMedia(list)// 是否传入已选图片 List<LocalMedia> list
                .minimumCompressSize(100)// 小于100kb的图片不压缩
                .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
    }

    private void cameraConfig() {
        // 单独拍照
        mSelectionModel.minSelectNum(1)// 最小选择数量
                .selectionMode(PictureConfig.SINGLE)// 多选 or 单选
                .previewImage(true)// 是否可预览图片
                .previewVideo(false)// 是否可预览视频
                .enablePreviewAudio(false) // 是否可播放音频
                .enableCrop(false)// 是否裁剪
                .compress(true)// 是否压缩
                .openClickSound(false)// 是否开启点击声音
                .selectionMedia(list)// 是否传入已选图片
                .previewEggs(false)//预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
                //.previewEggs(false)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
                //.cropCompressQuality(90)// 裁剪压缩质量 默认为100
                .minimumCompressSize(100)// 小于100kb的图片不压缩
                //.cropWH()// 裁剪宽高比，设置如果大于图片本身宽高则无效
                //.rotateEnabled() // 裁剪是否可旋转图片
                //.scaleEnabled()// 裁剪是否可放大缩小图片
                //.videoQuality()// 视频录制质量 0 or 1
                //.videoSecond()////显示多少秒以内的视频or音频也可适用
                .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
    }

    /**
     * PictureSelector 配置
     */
    private void configVideo() {
        // 进入相册 以下是例子：用不到的api可以不写
        mPictureSelector.openGallery(PictureMimeType.ofVideo())//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
                .setPictureStyle(mPictureParameterStyle)//主题样式(不设置为默认样式) 也可参考demo values/styles下 例如：R.style.picture.white.style
                .maxSelectNum(max)// 最大图片选择数量 int
                .minSelectNum(1)// 最小选择数量 int
                .imageSpanCount(4)// 每行显示个数 int
                .selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE
                .previewVideo(true)// 是否可预览视频 true or false
                .enablePreviewAudio(false) // 是否可播放音频 true or false
                .isCamera(true)// 是否显示拍照按钮 true or false
                .openClickSound(false)// 是否开启点击声音 true or false
                .selectionMedia(list)// 是否传入已选图片 List<LocalMedia> list
                .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
    }

    /**
     * 清除缓存
     *
     * @param context context
     * @param type    PictureMimeType.ofImage()
     */
    public void deleteCache(Context context, int type) {
        PictureFileUtils.deleteCacheDirFile(context, type);
    }

    /**
     * 预览图片/视频
     *
     * @param pContext context
     * @param url      视频图片地址
     */
    public void previewImage(AppCompatActivity pContext, String url) {
        PictureSelector.create(pContext).externalPictureVideo(url);
    }

    /**
     * 预览图片/视频
     *
     * @param pContext context
     * @param url      视频图片地址
     */
    public void previewImage(Fragment pContext, String url) {
        PictureSelector.create(pContext).externalPictureVideo(url);
    }

    private void themeConfig(Context pContext) {
        // 是否改变状态栏字体颜色(黑白切换)
        mPictureParameterStyle.isChangeStatusBarFontColor = false;
        // 是否开启右下角已完成(0/9)风格
        mPictureParameterStyle.isOpenCompletedNumStyle = false;
        // 是否开启类似QQ相册带数字选择风格
        mPictureParameterStyle.isOpenCheckNumStyle = false;
        // 相册状态栏背景色
        mPictureParameterStyle.pictureStatusBarColor = Color.parseColor("#393a3e");
        // 相册列表标题栏背景色
        mPictureParameterStyle.pictureTitleBarBackgroundColor = Color.parseColor("#393a3e");
        // 相册列表标题栏右侧上拉箭头
        mPictureParameterStyle.pictureTitleUpResId = R.drawable.picture_icon_arrow_up;
        // 相册列表标题栏右侧下拉箭头
        mPictureParameterStyle.pictureTitleDownResId = R.drawable.picture_icon_arrow_down;
        // 相册文件夹列表选中圆点
        mPictureParameterStyle.pictureFolderCheckedDotStyle = R.drawable.picture_orange_oval;
        // 相册返回箭头
        mPictureParameterStyle.pictureLeftBackIcon = R.drawable.picture_icon_back;
        // 标题栏字体颜色
        mPictureParameterStyle.pictureTitleTextColor = ContextCompat.getColor(pContext, R.color.picture_color_white);
        // 相册右侧取消按钮字体颜色
        mPictureParameterStyle.pictureCancelTextColor = ContextCompat.getColor(pContext, R.color.picture_color_white);
        // 相册列表勾选图片样式
        mPictureParameterStyle.pictureCheckedStyle = R.drawable.picture_checkbox_selector;
        // 相册列表底部背景色
        mPictureParameterStyle.pictureBottomBgColor = ContextCompat.getColor(pContext, R.color.picture_color_fa);
        // 已选数量圆点背景样式
        mPictureParameterStyle.pictureCheckNumBgStyle = R.drawable.picture_num_oval;
        // 相册列表底下预览文字色值(预览按钮可点击时的色值)
        mPictureParameterStyle.picturePreviewTextColor = ContextCompat.getColor(pContext, R.color.picture_color_fa632d);
        // 相册列表底下不可预览文字色值(预览按钮不可点击时的色值)
        mPictureParameterStyle.pictureUnPreviewTextColor = ContextCompat.getColor(pContext, R.color.picture_color_9b);
        // 相册列表已完成色值(已完成 可点击色值)
        mPictureParameterStyle.pictureCompleteTextColor = ContextCompat.getColor(pContext, R.color.picture_color_fa632d);
        // 相册列表未完成色值(请选择 不可点击色值)
        mPictureParameterStyle.pictureUnCompleteTextColor = ContextCompat.getColor(pContext, R.color.picture_color_9b);
        // 预览界面底部背景色
        mPictureParameterStyle.picturePreviewBottomBgColor = ContextCompat.getColor(pContext, R.color.picture_color_grey_3e);
        // 外部预览界面删除按钮样式
        mPictureParameterStyle.pictureExternalPreviewDeleteStyle = R.drawable.picture_icon_delete;
        // 外部预览界面是否显示删除按钮
        mPictureParameterStyle.pictureExternalPreviewGonePreviewDelete = true;

//        // 以下设置如果用不上则不要设置，使用默认即可
//        // 自定义相册右侧文本内容设置
//        mPictureParameterStyle.pictureRightDefaultText = "";
//        // 自定义相册未完成文本内容
//        mPictureParameterStyle.pictureUnCompleteText = "";
//        // 自定义相册完成文本内容
//        mPictureParameterStyle.pictureCompleteText = "";
//        // 自定义相册列表不可预览文字
//        mPictureParameterStyle.pictureUnPreviewText = "";
//        // 自定义相册列表预览文字
//        mPictureParameterStyle.picturePreviewText = "";
//        // 自定义相册标题字体大小
//        mPictureParameterStyle.pictureTitleTextSize = 18;
//        // 自定义相册右侧文字大小
//        mPictureParameterStyle.pictureRightTextSize = 14;
//        // 自定义相册预览文字大小
//        mPictureParameterStyle.picturePreviewTextSize = 14;
//        // 自定义相册完成文字大小
//        mPictureParameterStyle.pictureCompleteTextSize = 14;
//        // 自定义原图文字大小
//        mPictureParameterStyle.pictureOriginalTextSize = 14;
    }
}
